import matplotlib.pyplot as plt
import numpy as np
from matplotlib.animation import FuncAnimation


# 定义函数和导数
def func(x):
    return x ** 4 + 4 * x ** 2 - 10 - x ** 3


def derivative(x):
    return 4 * x ** 3 + 8 * x ** 2 - 3 * x ** 2


# 创建图形和轴
fig, ax = plt.subplots(2, 1, figsize=(8, 6))
ax[0].set_title('Function: y = x ** 4 + 4 * x ** 2 - 10 - x ** 3')
ax[1].set_title('Derivative: dy/dx = 4 * x ** 3 + 8 * x ** 2 - 3 * x ** 2')

# 初始化数据
x_values = np.linspace(-10, 10, 400)
y_values = func(x_values)
dydx_values = derivative(x_values)

# 初始化线条
line_y, = ax[0].plot([], [], 'r-')
line_dydx, = ax[1].plot([], [], 'b-')

# 初始化数据范围
ax[0].set_xlim(x_values.min(), x_values.max())
ax[0].set_ylim(y_values.min(), y_values.max())
ax[1].set_xlim(x_values.min(), x_values.max())
ax[1].set_ylim(dydx_values.min(), dydx_values.max())


# 初始化动画函数
def init():
    line_y.set_data([], [])
    line_dydx.set_data([], [])
    return line_y, line_dydx


# 更新动画函数
def update(frame):
    x = x_values[:frame]
    y = y_values[:frame]
    dydx = dydx_values[:frame]
    line_y.set_data(x, y)
    line_dydx.set_data(x, dydx)
    return line_y, line_dydx


# 创建动画
ani = FuncAnimation(fig, update, frames=len(x_values), init_func=init, blit=True, interval=20)

# 显示动画
plt.show()
